/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "曲线视口工作区.h"
#include "ui曲线编辑器.h"


static std::vector<C_节点基类*> gNode;


static C_Widget* g关键帧曲线控制点弹出菜单 = nullptr;




bool on_曲线编辑框打开(C_Widget* self, bool show) {
	C_工作区页面* 工作区 = dynamic_cast<C_工作区页面*>(self);
	C_曲线编辑视口::g当前操作曲线视口 = (C_曲线编辑视口*)(f_ui_get滚动框视口(工作区->mui_画布页面));

	
	f_曲线视口工作区_设置当前编辑节点();
	f_曲线视口工作区_设置当前编辑物体();
	C_曲线编辑视口::g当前操作曲线视口->f_重建曲线绘制();

	return false;
}

static void on_控制点类型切换菜单项(C_Widget* self, const std::wstring name, uint16 id) {
	uint32 控制点类型 = 0;
	if (name == L"自动") {
		控制点类型 = DEF_CONTORL_POINT_AUTO;
	}
	else if (name == L"自由") {
		控制点类型 = DEF_CONTORL_POINT_FREE;
	}
	else if (name == L"对齐") {
		控制点类型 = DEF_CONTORL_POINT_ALGNED;
	}
	else if (name == L"向量") {
		控制点类型 = DEF_CONTORL_POINT_VECTOR;
	}

	f_工作区_切换控制点类型(控制点类型);
}


void f_工作区页面_曲线视口初始化(S_UI创建环境& ctx) {
	S_菜单创建参数 菜单创建参数 = {
		on_控制点类型切换菜单项, {
			{L"自动", "", nullptr},
		    {L"自由", "", nullptr},
		    {L"对齐", "", nullptr},
		    {L"向量", "", nullptr},
	}
	};

	g关键帧曲线控制点弹出菜单 = f_ui_创建菜单(e_纵向, 菜单创建参数, ctx);

}

C_工作区页面* f_工作区页面_曲线视口create(S_UI创建环境& ctx) {
	auto ui曲线编辑视口 = f_工作区页面_创建曲线视口(ctx);
	

	C_状态条* tool = new C_状态条(ctx);
	C_工作区页面* 工作区 = new C_工作区页面(E_工作区类型::e_曲线视口, ctx, E_方向::e_横向, ui曲线编辑视口, tool);
	工作区->mf_打开关闭 = on_曲线编辑框打开;


	std::vector<S_Props> props;
	S_Props	prop;

	prop = f_alloc_NoneProp();
	props.push_back(prop);

	//f_NodeCtx_get帧().当前帧.m_UI->m_Update = f_当前帧PropUpdate;
	props.push_back(f_NodeCtx_get帧().当前帧);
	props.push_back(f_NodeCtx_get帧().帧区间);

	prop = f_alloc_NoneProp();
	props.push_back(prop);

	tool->f_构建属性部件(props, tool);

	
	C_曲线编辑视口::g当前操作曲线视口 = dynamic_cast<C_曲线编辑视口*>(f_ui_get滚动框视口(ui曲线编辑视口));


	S_键盘键位映射* 快捷键 = f_widget_init_键盘位映射();
	快捷键->event = f_工作区_打开曲线控制点类型切换菜单;
	快捷键->键盘按键[0] = S_InputKey::e_KEY_V;
	快捷键->键盘状态[0] = DEF_按键状态_按下 | DEF_按键状态_按下中;
	快捷键->发生组件 = ui曲线编辑视口;
	f_ui_注册键盘快捷键(ui曲线编辑视口, 快捷键);


	return 工作区;
}

void f_曲线视口页面_联动更新() {
	for (auto& e : C_曲线编辑视口::g_曲线视口页面) {
		if (e->m_是否未绘制 == false) {
			f_时间工作区_刷新时间线绘制(
				C_曲线编辑视口::g当前操作曲线视口,
				C_曲线编辑视口::g当前操作曲线视口->m_时间线绘制,
				f_prop_I32(f_NodeCtx_get帧().当前帧),
				C_曲线编辑视口::g当前操作曲线视口->m_父部件->m_Size.y);
		}
	}
	
}


static void f_提取骨骼动画曲线(std::vector<S_物体*>& obs) {
	for (auto& e : obs) {
		if (e->m_Type == E_物体类型::t_骨骼) {
			if (e->m_位置 && e->m_位置->count)
				//for (auto* c = e->m_位置->曲线通道; c; c = c->ptr_尾) {
				//	g当前操作曲线视口->m_动画曲线.push_back(DEF_物体动画曲线(c));
				//}

			if (e->m_旋转 && e->m_旋转->count)
				//for (auto* c = e->m_旋转->曲线通道; c; c = c->ptr_尾) {
				//	g当前操作曲线视口->m_动画曲线.push_back(DEF_物体动画曲线(c));
				//}

			if (e->m_缩放 && e->m_缩放->count)
				//for (auto* c = e->m_缩放->曲线通道; c; c = c->ptr_尾) {
				//	g当前操作曲线视口->m_动画曲线.push_back(DEF_物体动画曲线(c));
				//}

			f_提取骨骼动画曲线(e->m_子物体);
			
		}
	}
	

	
}

void f_曲线视口工作区_设置当前编辑节点() {
	std::vector<C_节点基类*> nodes = f_global_get激活节点();
	gNode = nodes;

	if (C_曲线编辑视口::g当前操作曲线视口) {
		C_曲线编辑视口::g当前操作曲线视口->m_动画曲线.clear();

		for (auto& node : gNode) {
			auto* ob = node->f_get虚拟体();
			
			if (ob) {
				if (ob->m_子物体.size()) {

				}
				//f_提取骨骼动画曲线(ob->m_子物体);
				if (ob->m_位置) C_曲线编辑视口::g当前操作曲线视口->m_动画曲线.push_back(ob->m_位置);
				if (ob->m_旋转) C_曲线编辑视口::g当前操作曲线视口->m_动画曲线.push_back(ob->m_旋转);
				if (ob->m_缩放) C_曲线编辑视口::g当前操作曲线视口->m_动画曲线.push_back(ob->m_缩放);

			}

			node->f_getAN曲线();
		}

		C_曲线编辑视口::g当前操作曲线视口->f_重建曲线绘制();
	}
}

void f_曲线视口工作区_设置当前编辑物体() {
	if (C_曲线编辑视口::g当前操作曲线视口) {
		C_曲线编辑视口::g当前操作曲线视口->m_动画曲线.clear();

		for (auto& ob : S_节点数据::g_选中激活物体) {
			if (ob->m_位置) C_曲线编辑视口::g当前操作曲线视口->m_动画曲线.push_back(ob->m_位置);
			if (ob->m_旋转) C_曲线编辑视口::g当前操作曲线视口->m_动画曲线.push_back(ob->m_旋转);
			if (ob->m_缩放) C_曲线编辑视口::g当前操作曲线视口->m_动画曲线.push_back(ob->m_缩放);
		}

		C_曲线编辑视口::g当前操作曲线视口->f_重建曲线绘制();
	}
}

E_事件是否传递 f_工作区_打开曲线控制点类型切换菜单(C_Widget* self, uint8 状态) {
	f_ui_打开菜单(g关键帧曲线控制点弹出菜单, C_Widget::g_鼠标.gPos - 10);
	return E_事件是否传递::e_事件传递_终止;
}








